package com.example.mq.common;

import java.io.*;

// 下面的逻辑不仅仅是Message，其他Java中的对象也通过这样的逻辑来进行序列化和反序列化
// 想要实现序列化和反序列化，需要实现Serializable接口，Java标准库要求的
public class BinaryTool {
    // 一个对象序列化为一个字节数组
    public static byte[] toBytes(Object obj) throws IOException {
        // ByteArrayOutputStream 解决数组长度不确定的问题
        // 这个流对象相当于一个变长的字节数组，可以把obj序列化的数据逐渐写入到这个流中，再统一转成字节数组
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            // ObjectOutputStream是为了序列化
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // writeObject会把obj进行序列化，生产二进制字节数据，然后写入到objectOutputStream中
                // 由于ObjectOutputStream 关联到 ByteArrayOutputStream 最终写入ByteArrayOutputStream中
                objectOutputStream.writeObject(obj);
            }
            // 二进制数据转为字节数组
            return byteArrayOutputStream.toByteArray();
        }
    }

    // 一个字节数组反序列化为一个对象
    public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
        Object obj = null;
        try (InputStream inputStream = new ByteArrayInputStream(bytes)){
            try (ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
                // readObject就是从bytes这个字节数组中读取数据，反序列化出一个对象
                obj = objectInputStream.readObject();
            }
        }
        return obj;
    }
}
